package com.beemans.common

import android.app.Application
import android.os.Build
import android.webkit.WebView
import androidx.annotation.CallSuper
import com.alibaba.android.patronus.Patrons
import com.beemans.common.utils.CrashHandler
import com.blankj.utilcode.util.LogUtils
import com.blankj.utilcode.util.ProcessUtils
import com.blankj.utilcode.util.Utils
import com.getkeepsafe.relinker.ReLinker
import com.tencent.mmkv.MMKV
import com.tiamosu.fly.utils.getAppComponent

/**
 * @author tiamosu
 * @date 2022/4/29.
 */
interface ICommonApp {

    fun initConfigurator()

    @CallSuper
    fun onAppCreate() {
        initCrash()
        initWebView()
        initSDK(ProcessUtils.isMainProcess())
    }

    @CallSuper
    fun initSDK(isMainProcess: Boolean) {
        if (isMainProcess) {
            initPatrons()
        }
        initMmkv()
        initLog()
    }

    /**
     * Crash初始化
     */
    fun initCrash() {
        CrashHandler.init()
    }

    /**
     * patrons 初始化（一行代码解决 Android 32位应用因虚拟内存不足导致的 libc:abort(signal 6)）
     */
    fun initPatrons() {
        Patrons.init(Utils.getApp(), null)
    }

    /**
     * MMKV初始化，替代SP
     */
    fun initMmkv() {
        val dir = getAppComponent().cacheFile().absolutePath + "/mmkv"
        MMKV.initialize(Utils.getApp(), dir) { libName ->
            ReLinker.loadLibrary(Utils.getApp(), libName)
        }
    }

    /**
     * Log打印初始化
     */
    fun initLog(logEnable: Boolean = true) {
        LogUtils.getConfig()
            .setLogSwitch(logEnable)
            .setConsoleSwitch(logEnable)
    }

    /**
     * 安卓9.0后不允许多进程使用同一个数据目录
     */
    fun initWebView() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            val processName = Application.getProcessName()
            if (!Utils.getApp().packageName.equals(processName)) {
                kotlin.runCatching {
                    WebView.setDataDirectorySuffix(processName)
                }
            }
        }
    }
}